/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.deployment.manager;

import br.com.deployment.entidade.selo.Distribuicao;
import br.com.deployment.entidade.selo.Selo;
import br.com.deployment.entidade.selo.TipoSelo;
import br.com.deployment.entidade.acesso.Usuario;
import br.com.deployment.message.Msg;
import br.com.deployment.servico.DistribuicaoServico;
import br.com.deployment.servico.SeloServico;
import br.com.deployment.servico.TipoSeloServico;
import br.com.deployment.servico.UsuarioServico;
import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.ejb.EJBAccessException;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import org.primefaces.event.SelectEvent;
import org.primefaces.model.chart.CartesianChartModel;
import org.primefaces.model.chart.ChartSeries;
import org.primefaces.model.chart.PieChartModel;

/**
 *
 * @author elyjr
 */
@ManagedBean
@ViewScoped
public class ManagerSelo implements Serializable{

    @EJB
    SeloServico seloServico;
    
    @EJB
    TipoSeloServico tipoSeloDao;
    
    @EJB
    UsuarioServico usuarioDao;
    
    @EJB
    DistribuicaoServico distribuicaoDao;
    
    private Selo selo;
    private List<Distribuicao> listSelo;
    private int num1 = 0, num2 = 0;
    private CartesianChartModel categoryModel;
    private Long qtd;
    private PieChartModel pieModel;
    private Usuario usr;
    private List<Selo> listCancelSelo;
    
    private Selo cancelSelo;

    public ManagerSelo() {
    }

    @PostConstruct
    public void init() {
        selo = new Selo();
        listSelo = new ArrayList<Distribuicao>();
        usr = new Usuario();
        qtd = 0L;
        cancelarSelo();
        user();
//        createCategoryModel();
        
    }

    public List<Selo> getListCancelSelo() {
        return listCancelSelo;
    }

    public void setListCancelSelo(List<Selo> listCancelSelo) {
        this.listCancelSelo = listCancelSelo;
    }
    
    

    public void reinit() {
        selo = new Selo();
        listSelo = new ArrayList<Distribuicao>();
    }

    public List<Distribuicao> getListSelo() {
        return listSelo;
    }

    public void setListSelo(List<Distribuicao> listSelo) {
        this.listSelo = listSelo;
    }

    public Usuario getUsr() {
        return usr;
    }

    public void setUsr(Usuario usr) {
        this.usr = usr;
    }
    
   

    public int getNum1() {
        return num1;
    }

    public void setNum1(int num1) {
        this.num1 = num1;
    }

    public int getNum2() {
        return num2;
    }

    public void setNum2(int num2) {
        this.num2 = num2;
    }

    public Selo getSelo() {
        return selo;
    }

    public void setSelo(Selo selo) {
        this.selo = selo;
    }
    
     public Long getQtd() {
        return qtd;
    }

    public void setQtd(Long qtd) {
        this.qtd = qtd;
    }
    
    

    public PieChartModel getPieModel() {
        return pieModel;
    }

    public void setPieModel(PieChartModel pieModel) {
        this.pieModel = pieModel;
    }

    public CartesianChartModel getCategoryModel() {
        return categoryModel;
    }

    public void setCategoryModel(CartesianChartModel categoryModel) {
        this.categoryModel = categoryModel;
    }

    public List<Distribuicao> listarSelo() {
        try {
            listSelo = distribuicaoDao.findRecebedor(usr);
            List<Selo> selo3 = new ArrayList<Selo>();
            List<Distribuicao> dis = new ArrayList<Distribuicao>();
            
            for (Distribuicao distribuicao : listSelo) {
                for (Selo selo2 : distribuicao.getListSelo()){
                    if(selo2.getProtocolado() != null){
                        if(selo2.getProtocolado() == true){
                            selo3.add(selo2);
                        }
                    }
                }
                distribuicao.setListSelo(selo3);
                selo3 = new ArrayList<Selo>();
                dis.add(distribuicao);
            }
            
            return dis;

        } catch (EJBAccessException erro) {
            System.out.println("Erro ----" + erro);
        } 
        return listSelo;
    }

    public void salvar() {
        try {
            for (int i = num1; i <= num2; i++) {
               
                seloServico.create(selo);
            }


            reinit();
            Msg.messagemInfo("Selo salvo com sucesso ");
           
        } catch (EJBAccessException erro) {
            erro.getMessage();
        } catch (Exception erro) {
            erro.getMessage();
        }
    }

    public void alterar() {
        try {

            seloServico.edit(selo);

            Msg.messagemInfo("Selo Atualizado com sucesso ");
           
        } catch (EJBAccessException erro) {
            erro.getMessage();
        } catch (Exception erro) {
            erro.getMessage();
        }
    }

    public void indexSelo() {
        redirect("indexSelo.xhtml");

    }

    public void criarSelo() {
        redirect("criarEntradaSelo.xhtml");
    }

    
    public void redirect(String string) {
        try {
            FacesContext context = FacesContext.getCurrentInstance();
            context.getExternalContext().redirect(string);
        } catch (IOException ex) {
            Logger.getLogger(ManagerImovel.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void editarSelo(Selo s) {
        FacesContext context = FacesContext.getCurrentInstance();
        if (s != null) {
            try {

                selo = s;

                context.getExternalContext().redirect("/Cartorio-war/editarSelo.xhtml");
            } catch (IOException ex) {
                Logger.getLogger(ManagerPessoa.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
    private void user(){
        usr = usuarioDao.verificarUsuarioNome(FacesContext.getCurrentInstance().getExternalContext().getUserPrincipal().getName());
    }
    public CartesianChartModel createCategoryModel() {
        qtd=0L;
        List<TipoSelo> tipoSelo = new ArrayList<TipoSelo>();

        tipoSelo = tipoSeloDao.findAll();

        categoryModel = new CartesianChartModel();
        pieModel = new PieChartModel();

        for (TipoSelo tipoSelo1 : tipoSelo) {
            pieModel.set(tipoSelo1.getNome(), distribuicaoDao.qtdSelo(usr, tipoSelo1));

        }
        
        ChartSeries teste = new ChartSeries();
        Map<Object, Number> m;
        for (TipoSelo tipoSelo2 : tipoSelo) {
            Long n = distribuicaoDao.qtdSelo(usr, tipoSelo2);
            
            m = new HashMap<Object, Number>();
            m.put(tipoSelo2.getNome(), n );
            teste.setLabel(tipoSelo2.getNome());
            teste.setData(m);
            
            if(qtd < n){
                qtd = n;
            }
            qtd = (qtd + (qtd / 3));
             categoryModel.addSeries(teste);
             teste = new ChartSeries();
        }
        
        return categoryModel;
       
    }
    
    public void cancelarSelo(){
        cancelSelo = new Selo();
        listCancelSelo = new ArrayList<Selo>();
//        redirect("cancelarSelo.xhtml");
        
    }
    public void removeList(Selo c){
        listCancelSelo.remove(c);
    }
    public void addListCancel(){
        if((seloServico.exist(cancelSelo, true) == true)){
            cancelSelo.setTipoSelo(tipoSeloDao.find(cancelSelo.getTipoSelo().getId()));
            listCancelSelo.add(cancelSelo);
            cancelSelo = new Selo();
        }
    }
    
    public void cancelar(){
        if (!listCancelSelo.isEmpty()) {
                seloServico.cancelar(listCancelSelo);
                listCancelSelo.clear();                
        }else{
            Msg.messagemError("Para cancelar, adicione itens à lista");
        }
        
    }
    public void handleSelectTipoSelo(SelectEvent event) {
        TipoSelo ts = (TipoSelo) event.getObject();
        ts = (tipoSeloDao.find(ts.getId()));
        cancelSelo.setTipoSelo(ts);
        
    }
    
    public Selo getCancelSelo() {
        return cancelSelo;
    }

    public void setCancelSelo(Selo cancelSelo) {
        this.cancelSelo = cancelSelo;
    }
    
   
}
